HAL I3C initialization and configuration functions migration

The goal of this page is to show how to migrate the initialization sequence using STM32CubeMX2:

  • Open STM32CubeMX2 I3C configuration panel.

  • Configure the SW layer HAL.

  • Configure the main I3C features.

  • Configure the additional I3C features if needed.

  • Configure the I3C DMA(s) if the application requires the I3C to be used in DMA mode.

  • Configure the NVIC if the application requires the I3C to be used in IT mode.

  • Generate the code.

Note

The configuration below might vary from a series to another.

HAL I3C configuration panel

Create a new project with the STM32CubeMX2, then start the initialization and the main configuration.

Project configuration panel

HAL I3C main features configuration

Configure the I3C main features.

I3C main feature configuration

HAL I3C advanced features configuration

Configure the advanced I3C features.

I3C advanced feature configuration

GPIO configuration

Configure GPIO pins.

I3C GPIO configuration

DMA configuration

Configure the DMA for data reception as needed.

DMA TX configuration

I3C DMA TX configuration

DMA RX configuration

I3C DMA RX configuration

DMA TC configuration

I3C DMA TC configuration

NVIC configuration

Configure the NVIC in case of an interrupt.

I3C NVIC configuration

Generated I3C initialization and de-initialization sequences

The I3C initialization sequence is generated in the mx_i3c1_hal_init function in mx_i3c1.c file under $YOUR_PROJECT_NAME$/$YOUR_PROJECT_NAME$_SW/generated/STM32Cube_CodeGen.

Related concepts:

STM32CubeMX2 Generated : I3C initialization and de-initialization sequences

Topic

Code Snippet HAL1

Code Snippet HAL2

Handle declaration

I3C_HandleTypeDef hi3c1;
static hal_i3c_handle_t hI3C1;

Initialization and configuration sequence

static void MX_I3C1_Init(void)
{

  I3C_FifoConfTypeDef sFifoConfig = {0};
  I3C_TgtConfTypeDef sTgtConfig = {0};

  hi3c1.Instance = I3C1;
  hi3c1.Mode = HAL_I3C_MODE_TARGET;
  hi3c1.Init.TgtBusCharacteristic.BusAvailableDuration = 0x1e;
  if (HAL_I3C_Init(&hi3c1) != HAL_OK)
  {
    Error_Handler();
  }

  sFifoConfig.RxFifoThreshold = HAL_I3C_RXFIFO_THRESHOLD_1_4;
  sFifoConfig.TxFifoThreshold = HAL_I3C_TXFIFO_THRESHOLD_1_4;
  sFifoConfig.ControlFifo = HAL_I3C_CONTROLFIFO_DISABLE;
  sFifoConfig.StatusFifo = HAL_I3C_STATUSFIFO_DISABLE;

  if (HAL_I3C_SetConfigFifo(&hi3c1, &sFifoConfig) != HAL_OK)
  {
    Error_Handler();
  }

  sTgtConfig.Identifier = 0;
  sTgtConfig.MIPIIdentifier = 0;
  sTgtConfig.CtrlRoleRequest = DISABLE;
  sTgtConfig.HotJoinRequest = DISABLE;
  sTgtConfig.IBIRequest = DISABLE;
  sTgtConfig.IBIPayload = DISABLE;
  sTgtConfig.IBIPayloadSize = HAL_I3C_PAYLOAD_1_BYTE;
  sTgtConfig.MaxReadDataSize = 0;
  sTgtConfig.MaxWriteDataSize = 0;
  sTgtConfig.CtrlCapability = DISABLE;
  sTgtConfig.GroupAddrCapability = DISABLE;
  sTgtConfig.DataTurnAroundDuration = HAL_I3C_TURNAROUND_TIME_TSCO_LESS_12NS;
  sTgtConfig.MaxReadTurnAround = 0;
  sTgtConfig.MaxDataSpeed = HAL_I3C_GETMXDS_FORMAT_1;
  sTgtConfig.MaxSpeedLimitation = DISABLE;
  sTgtConfig.HandOffActivityState = HAL_I3C_HANDOFF_ACTIVITY_STATE_0;
  sTgtConfig.HandOffDelay = DISABLE;
  sTgtConfig.PendingReadMDB = DISABLE;
  if (HAL_I3C_Tgt_Config(&hi3c1, &sTgtConfig) != HAL_OK)
  {
    Error_Handler();
  }

}
static void MX_GPIO_Init(void)
{
  __HAL_RCC_GPIOH_CLK_ENABLE();
  __HAL_RCC_GPIOB_CLK_ENABLE();

}
void HAL_I3C_MspInit(I3C_HandleTypeDef* hi3c)
{
  GPIO_InitTypeDef GPIO_InitStruct = {0};
  RCC_PeriphCLKInitTypeDef PeriphClkInitStruct = {0};
  if(hi3c->Instance==I3C1)
  {

    PeriphClkInitStruct.PeriphClockSelection = RCC_PERIPHCLK_I3C1;
    PeriphClkInitStruct.I3c1ClockSelection = RCC_I3C1CLKSOURCE_PCLK1;
    if (HAL_RCCEx_PeriphCLKConfig(&PeriphClkInitStruct) != HAL_OK)
    {
      Error_Handler();
    }
    __HAL_RCC_I3C1_CLK_ENABLE();

    __HAL_RCC_GPIOB_CLK_ENABLE();
    GPIO_InitStruct.Pin = GPIO_PIN_9|GPIO_PIN_8;
    GPIO_InitStruct.Mode = GPIO_MODE_AF_PP;
    GPIO_InitStruct.Pull = GPIO_NOPULL;
    GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_HIGH;
    GPIO_InitStruct.Alternate = GPIO_AF2_I3C1;
    HAL_GPIO_Init(GPIOB, &GPIO_InitStruct);

    HAL_NVIC_SetPriority(I3C1_EV_IRQn, 0, 0);
    HAL_NVIC_EnableIRQ(I3C1_EV_IRQn);
  }

}
hal_i3c_handle_t *mx_i3c1_hal_init(void)
{

  if (HAL_I3C_Init(&hI3C1, HAL_I3C1) != HAL_OK)
  {
    return NULL;
  }

  HAL_RCC_I3C1_EnableClock();

  if (HAL_RCC_I3C1_SetKernelClkSource(HAL_RCC_I3C1_CLK_SRC_PCLK1) != HAL_OK)
  {
    return NULL;
  }

  hal_i3c_ctrl_config_t i3c_ctrl_config;
  i3c_ctrl_config.timing_reg0 = 0x120101UL;
  i3c_ctrl_config.timing_reg1 = 0xA002EUL;
  if (HAL_I3C_CTRL_SetConfig(&hI3C1, &i3c_ctrl_config) != HAL_OK)
  {
    return NULL;
  }

  HAL_RCC_GPIOA_EnableClock();

  HAL_RCC_GPIOB_EnableClock();

  hal_gpio_config_t  gpio_config;

  gpio_config.mode        = HAL_GPIO_MODE_ALTERNATE;
  gpio_config.output_type = HAL_GPIO_OUTPUT_PUSHPULL;
  gpio_config.pull        = HAL_GPIO_PULL_NO;
  gpio_config.speed       = HAL_GPIO_SPEED_FREQ_HIGH;
  gpio_config.alternate   = HAL_GPIO_AF_2;
  HAL_GPIO_Init(HAL_GPIOA, HAL_GPIO_PIN_9, &gpio_config);

  gpio_config.mode        = HAL_GPIO_MODE_ALTERNATE;
  gpio_config.output_type = HAL_GPIO_OUTPUT_PUSHPULL;
  gpio_config.pull        = HAL_GPIO_PULL_NO;
  gpio_config.speed       = HAL_GPIO_SPEED_FREQ_HIGH;
  gpio_config.alternate   = HAL_GPIO_AF_3;
  HAL_GPIO_Init(HAL_GPIOB, HAL_GPIO_PIN_5, &gpio_config);

  /* Enable the Event interruption for I3C1 */
  HAL_CORTEX_NVIC_SetPriority(I3C1_EV_IRQn, HAL_CORTEX_NVIC_PREEMP_PRIORITY_0, HAL_CORTEX_NVIC_SUB_PRIORITY_0);
  HAL_CORTEX_NVIC_EnableIRQ(I3C1_EV_IRQn);

  /* Enable the Error interrupt for I3C1 */
  HAL_CORTEX_NVIC_SetPriority(I3C1_ERR_IRQn, HAL_CORTEX_NVIC_PREEMP_PRIORITY_0, HAL_CORTEX_NVIC_SUB_PRIORITY_0);
  HAL_CORTEX_NVIC_EnableIRQ(I3C1_ERR_IRQn);

  return &hI3C1;
}

Deinitialization sequence

void MX_I3C_DeInit(void)
{
  if (HAL_I3C_DeInit(&hI3C1) != HAL_OK)
  {
    Error_Handler();
  }
}
void HAL_I3C_MspDeInit(I3C_HandleTypeDef* hi3c)
{
  if(hi3c->Instance==I3C1)
  {
    __HAL_RCC_I3C1_CLK_DISABLE();

    HAL_GPIO_DeInit(GPIOB, GPIO_PIN_9|GPIO_PIN_8);

    HAL_NVIC_DisableIRQ(I3C1_EV_IRQn);
  }

}
void mx_i3c1_hal_deinit(void)
{
  HAL_CORTEX_NVIC_DisableIRQ(I3C1_EV_IRQn);

  HAL_CORTEX_NVIC_DisableIRQ(I3C1_ERR_IRQn);

  (void)HAL_I3C_DeInit(&hI3C1);

  HAL_RCC_I3C1_Reset();

  HAL_RCC_I3C1_DisableClock();

  HAL_GPIO_DeInit(HAL_GPIOA, HAL_GPIO_PIN_9);

  HAL_GPIO_DeInit(HAL_GPIOB, HAL_GPIO_PIN_5);

}

IRQ handle function

void I3C1_EV_IRQHandler(void)
{
  HAL_I3C_EV_IRQHandler(&hi3c1);
}

void I3C1_ER_IRQHandler(void)
{
  HAL_I3C_ER_IRQHandler(&hi3c1);
}
void I3C1_EV_IRQHandler(void)
{
    HAL_I3C_EV_IRQHandler(&hI3C1);
}

void I3C1_ERR_IRQHandler(void)
{
    HAL_I3C_ERR_IRQHandler(&hI3C1);
}